Страница 2 из 4 Еще одной важной характерной особенностью планов HTN является возможность совместного использования подзадач. Напомним, что совместным использованием подзадач называется применение одного и того же действия для реализации двух разных этапов в декомпозиции планов. Если совместное использование подзадач запрещено, то каждая конкретизация декомпозиции d' должна быть выполнена только одним способом, а не многими, что приводит к отсечению значительной части пространства поиска. Обычно такое отсечение обеспечивает некоторую экономию времени и в худшем случае приводит к решению, лишь немного более длинному, чем оптимальное. Но в некоторых случаях возникают более существенные проблемы. Например, рассмотрим цель: "Насладись медовым месяцем и создай большую семью". Библиотека планов может содержать решение "вступи в брак и отправляйся на Гавайи" для первой подцели и "вступи в брак и заведи двух детей" для второй. Без совместного использования подзадач план будет включать два разных действия по вступлению в брак для одного человека, но такой вариант многие считают весьма нежелательным. Интересным примером анализа затрат и результатов совместного использования подзадач является применение этого метода при оптимизации компиляторов. Рассмотрим задачу компиляции выражения tan (x) -sin (x). В большинстве компиляторов такая задача выполняется путем слияния результатов двух отдельных вызовов процедур тривиальным способом: все этапы процедуры вычисления тангенса tan выполняются перед каким-либо из этапов вычисления синуса sin. Но рассмотрим следующие аппроксимации для sin и tan с помощью рядов Тэйлора:  Планировщик HTN с совместным использованием подзадач может выработать более эффективное решение, поскольку он способен выбрать вариант реализации многочисленных этапов вычисления sin в сочетании с существующими этапами вычисления tan. В большинстве компиляторов межпроцедурное совместное использование этапов такого рода не осуществляется, поскольку для них потребовалось бы слишком много времени на рассмотрение всех возможных совместно используемых планов. Вместо этого в большинстве компиляторов каждый субплан вырабатывается независимо и только после этого, возможно, происходит модификация результата с помощью локального оптимизатора.
|